import Koa from 'koa'
import views from 'koa-views'
import json from 'koa-json'
import bodyparser from 'koa-bodyparser'
import logger from 'koa-logger'
import koajwt from 'koa-jwt'
import koaStatic from 'koa-static'
import { dirname } from 'path'
import { fileURLToPath } from 'url'

// 导入自定义模块
import log4js from './utils/log4js.js'
import util from './utils/util.js'
import router from './routes/router.js'
import { setupErrorHandlers } from './utils/error-handlers.js'
import config from './config/index.js'
const __dirname = dirname(fileURLToPath(import.meta.url))
const app = new Koa()
import './config/db.js'
app.use(bodyparser({
  enableTypes: ['json', 'form', 'text']
}))
app.use(json())
app.use(logger())
app.use(koaStatic(__dirname + '/public'))
app.use(views(__dirname + '/views', {
  extension: 'pug'
}))

// logger
app.use(async (ctx, next) => {
  log4js.info(`get params:${JSON.stringify(ctx.request.query)}`);
  log4js.info(`post params:${JSON.stringify(ctx.request.body)}`);
  try {
    await next();
  } catch (err) {
    // 处理401错误
    if (err.status == '401') {
      ctx.status = 200;
      ctx.body = util.fail('Token认证失败', util.CODE.AUTH_ERROR);
      log4js.error(`Token认证失败: ${ctx.url}`);
    } else {
      // 记录其他错误
      log4js.error(`请求处理错误: ${err.message}`);
      log4js.error(`错误堆栈: ${err.stack}`);
      
      // 设置错误响应
      ctx.status = err.status || 500;
      ctx.body = util.fail(err.message || '服务器内部错误');
      
      // 触发应用级错误事件
      ctx.app.emit('error', err, ctx);
    }
  }
})
// token 校验及白名单
app.use(koajwt({ secret: 'imooc' }).unless({
  path: config.whitelist
}))

app.use(router.routes(), router.allowedMethods())

// error-handling
app.on('error', (err, ctx) => {
  log4js.error(`服务器错误: ${err.message}`);
  log4js.error(`错误堆栈: ${err.stack}`);
  console.error('服务器错误:', err);
});

// 设置全局错误处理
setupErrorHandlers();

// 启动服务器
app.listen(config.PORT, () => {
  console.log(`服务器运行在 http://localhost:${config.PORT}`);
});

// export default app;
export default app